home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / m68k / tutor.arc / GETA.SA < prev    next >
Text File  |  1990-01-05  |  7KB  |  226 lines

  1. GETA     IDNT      1,0       GET ADDRESS Subroutine                  12/01/81
  2.          XDEF      GETA
  3.  SPC 1
  4.          XREF      GETNUMA
  5.          XREF.S    OFFSET
  6.          XREF.S    REGS
  7.          XREF      SYNTAX
  8.  SPC 3
  9.          SECTION   11
  10.  
  11. * GET ADDRESS
  12. *  ENTER (A5) POINTER START OF BUFFER
  13. *        (A6) POINTER END OF BUFFER
  14. *
  15. *  RETURN:  D0 = ADDRESS
  16.  SPC 1
  17. *        (A6) POINTER END OF BUFFER
  18. *
  19. *  RETURN:  D0 = ADDRESS
  20.  SPC 2
  21. * FORMATS HANDLED:
  22. *  1.  NUMBER        DEFAULTS TO HEX
  23. *  2.  $NUMBER       HEX
  24. *  3.  &NUMBER       DECIMAL
  25. *  4.  (A@)
  26. *  5.  NUMBER(A@)
  27. *  6.  (A@,D@)
  28. *  7.  NUMBER(A@,D@)
  29. *  8.  [NUMBER]      MEMORY INDIRECT
  30. *
  31. *   FORMATS 1,2,3,8  ADD OFFSET R0 UNLESS R1 - R7 SPECIFIED
  32.  SPC 2
  33. * WORK REGISTERS
  34. *  D4    VALUE BEING BUILT
  35. *
  36. *  D5    FLAG REGISTER
  37. *     = 8000XXXX  R@ GIVEN (GARO)
  38. *     = XXXX80XX  [  GIVEN (GALB)
  39. *     = XXXXXX80  (  GIVEN (GALP)
  40. *
  41. *  D6    FLAG REGISTER
  42. *     = 8000XXXX  A@ GIVEN           (GAAVF)
  43. *     = XXXX80XX  NEED PLUS OR MINUS (GANPM)
  44. *     = XXXXXX2B  +  PLUS GIVEN      (GAPMS)
  45. *             2D  -  MINUS GIVEN
  46.  SPC 1
  47. GETA     MOVEM.L   D4-D6/A0,-(A7)  SAVE SOME REGISTERS
  48.          CLR.L     D4        VALUE BEING BUILT
  49.          CLR.L     D5        FLAG REG
  50.          CLR.L     D6        FLAG REG
  51.  SPC 1
  52.          MOVE.B    (A5)+,D0  GET BYTE
  53.          CMP.L     A5,A6
  54.          BCS       GAP191    END OF BUFFER
  55.  SPC 1
  56.          CMP.B     #'[',D0
  57.          BNE.S     GAP113
  58.  SPC 1
  59. *  [  SET INDIRECT
  60.          OR.W      #$8000,D5 SET LEFT BRACKET (GALB)
  61.  SPC 1
  62. GAP111   MOVE.B    (A5)+,D0  GET BYTE
  63.          CMP.L     A5,A6
  64.          BCS       GAP191    END OF BUFFER
  65. GAP113   DS        0
  66.  SPC 1
  67.          CMP.B     #'+',D0
  68.          BEQ.S     GAP121    PLUS SIGN
  69.  SPC 1
  70.          CMP.B     #'-',D0
  71.          BEQ.S     GAP121    MINUS SIGN
  72.  SPC 1
  73.          CMP.B     #']',D0
  74.          BEQ.S     GAP131    RIGHT BRACKET (INDIRECT)
  75.  SPC 1
  76.          CMP.B     #'(',D0
  77.          BEQ.S     GAP141    LEFT PARIN
  78.  SPC 1
  79.          CMP.B     #',',D0
  80.          BEQ       GAP161    COMMA
  81.  SPC 1
  82.          CMP.B     #')',D0
  83.          BEQ       GAP181    RIGHT PARIN
  84.  SPC 1
  85.          CMP.B     #';',D0   "SEMI-COLON"
  86.          BEQ       GAP191    TERMINATE
  87.  SPC 1
  88.          CMP.B     #' ',D0   "SPACE"
  89.          BEQ       GAP191    TERMINATE
  90.  SPC 1
  91.          TST.W     D6        (GANPM)
  92.          BMI.S     GAE       NEEDS PLUS OR MINUS
  93.  SPC 1
  94.          CMP.B     #'R',D0
  95.          BEQ       GAP171    RELATIVE OFFSET
  96.  SPC 1
  97.          TST.B     D6        (GALP)
  98.          BMI.S     GAE       (...   NUMBER NOT ALLOWED
  99.  SPC 1
  100. * NONE OF ABOVE ASSUME NUMERIC VALUE
  101.          SUB.L     #1,A5     ADJUST (A5) TO FIRST CHAR
  102.          CLR.L     D0
  103.          BSR       GETNUMA
  104.  SPC 1
  105.          CMP.B     #'-',D6   (GAPMS)
  106.          BEQ.S     GAP118    MINUS SIGN
  107.  SPC 1
  108.          ADD.L     D0,D4     PLUS SIGN
  109.          BRA.S     GAP119
  110.  SPC 1
  111. GAP118   SUB.L     D0,D4
  112.  SPC 1
  113. GAP119   CLR.B     D6        (GAPMS)  RESET PLUS MINUS FLAG
  114.          OR.W      #$8000,D6 (GANPM)  SET NEED PLUS MINUS
  115. GAP111S  BRA       GAP111
  116.  SPC 1
  117. * (*) (-) SET ARITHMETIC OPERATOR
  118. GAP121   TST.B     D6        (GAPMS)
  119.          BNE.S     GAE       MULTI OPERATORS
  120.          MOVE.B    D0,D6     (GAPMS)
  121.          AND.W     #$00FF,D6 RESET (GANPM) NEED PLUS MINUS
  122.          BRA       GAP111S
  123.  SPC 1
  124. *  ]  CLOSE INDIRECT
  125. GAP131   TST.W     D5        (GALB)
  126.          BPL.S     GAE       [ MISSING
  127.  SPC 1
  128. * IF NO R@ GIVEN ADD R0
  129.          TST.L     D5        (GARO)
  130.          BMI.S     GAP135    R@ GIVEN
  131.          ADD.L     OFFSET,D4 NO R@ GIVEN; ADD R0
  132. GAP135   DS        0
  133.  SPC 1
  134.          MOVE.L    D4,A0
  135.          MOVE.L    (A0),D0
  136.          BRA       GAP199
  137.  SPC 1
  138. *  (  DO PARIN PAIR
  139. GAP141   TST.B     D5        (GALP)
  140.          BMI.S     GAE       MULTI (
  141.          TST.L     D5        (GARO)
  142.          BMI.S     GAE       R@ NOT ALLOWED WITH (..)
  143.          OR.B      #$80,D5   (GALP) SET LEFT PAREN
  144.  SPC 1
  145. * LEFT PARIN SET; MUST BE A@ NEXT
  146.          MOVE.B    (A5)+,D0  GET BYTE
  147.          CMP.L     A5,A6
  148.          BCS.S     GAE
  149.          CMP.B     #'A',D0
  150.          BNE.S     GAE       NOT A-REG
  151.          LEA       REGS+32,A0
  152.          BSR.S     GASRGN    GET VALUE IN A@
  153.          ADD.L     D1,D4
  154.          OR.L      #$80000000,D6     (GAAVF) A-REG VALUE FLAG
  155.          BRA       GAP111S
  156.  SPC 1
  157. GAE      BRA       SYNTAX
  158.  SPC 1
  159. *  COMMA  A-REG or
  160. *  COMMA  D-REG REQUIRED
  161. GAP161   TST.L     D6       (GAAVF)
  162.          BPL       GAE       NO A-REG SPECIFIED
  163.          MOVE.B    (A5)+,D0  GET BYTE
  164.          CMP.L     A5,A6
  165.          BCS       GAE
  166.          CMP.B     #'A',D0
  167.          BNE.S     GAP163
  168.          LEA       REGS+32,A0          GET VALUE IN A@
  169.          BRA.S     GAP165
  170. GAP163   CMP.B     #'D',D0
  171.          BNE       GAE       NOT D-REG
  172.          LEA       REGS,A0             GET VALUE IN D@
  173. GAP165   BSR.S     GASRGN
  174.          ADD.L     D1,D4
  175.          BRA       GAP111S
  176.  SPC 1
  177. *  R@  OFFSET
  178. GAP171   CMP.B     #'+',D6   (GAPMS)
  179.          BNE       GAE       ONLY + ALLOWED
  180.  SPC 1
  181. * ONLY ONE R@ ALLOWED
  182.          TST.L     D5        (GARO)
  183.          BMI       GAE       MULIT R@
  184.          OR.L      #$80000000,D5       SET R@ GIVEN (GARO)
  185.  SPC 1
  186.          LEA       OFFSET,A0
  187.          BSR.S     GASRGN    GET VALUE IN R@
  188.          ADD.L     D1,D4
  189.          BRA       GAP119
  190.  SPC 1
  191. *  )  CLOSE THE WORLD
  192. GAP181   TST.L     D6        (GAAVF)
  193.          BPL       GAE       NO (
  194.          BRA.S     GAP197
  195.  SPC 1
  196. *  SPACE  TERMINATOR
  197. GAP191   TST.W     D5        (GALB)
  198.          BMI       GAE       [ WITHOUT ]
  199.          TST.B     D5        (GALP)
  200.          BMI       GAE       ( WITHOUT )
  201.          SUB.L     #1,A5     ADJUST CHAR POINTER
  202.  SPC 1
  203. * IF NO R@ GIVEN ADD R0
  204.          TST.L     D5        (GARO)
  205.          BMI.S     GAP197    R@ GIVEN
  206.          ADD.L    OFFSET,D4
  207. GAP197   MOVE.L    D4,D0
  208.  SPC 1
  209. GAP199   MOVEM.L   (A7)+,D4-D6/A0
  210.          RTS
  211.  SPC 1
  212. * GET NEXT NUMBER
  213. *  A0 = POINTER TO TABLE OF VALUES
  214. *  D1 = VALUE ON RETURN
  215. GASRGN   CLR.L     D0
  216.          MOVE.B    (A5)+,D0  GET BYTE
  217.          CMP.L     A5,A6
  218.          BCS       GAE
  219.          SUB.B     #'0',D0   ADJUST TO ZERO
  220.          CMP.B     #7,D0
  221.          BHI       GAE       NOT 0 - 7
  222.          MULU      #4,D0     4 * OFFSET
  223.          MOVE.L    (A0,D0),D1
  224.          RTS
  225.  SPC 3
  226.          END